Desenvolvimento Multicamadas em Csharp (C#(csharp)) - Parte 3 - Exemplo prático [Lógica de Negócios]
Neste terceiro artigo serão apresentadas as classes que compõe a regra de negócios do Sistema de Controle de Apólices de Seguro proposto no primeiro artigo.
Desenvolvendo uma aplicação Multicamadas para Windows em C#
Parte 3 )Camada Intermediária: Lógica de Negócios
Introdução
Este artigo é o terceiro de uma
série de artigos que apresentam um exemplo prático e simples abordando o
desenvolvimento em camadas em C#.
No primeiro artigo foi apresentado
um cenário para o desenvolvimento da aplicação e criado o Banco de Dados com as
respectivas tabelas e o mapeamento Entidade Relacionamento entre elas.
No segundo artigo dessa série foi
apresentada a classes da camada “2 – Camada Intermediaria” que representa a
lógica do controlador, classe essa que faz a interface entre a lógica de negócio
e os dados no banco de dados.

Figura SEQ
Figura \* ARABIC 1 - Lógica de Negócios
Neste terceiro artigo serão
apresentadas as classes que compõe a regra de negócios do Sistema de Controle
de Apólices de Seguro proposto no primeiro artigo.
A lógica de negócios na camada 2
apresentada impõe as regras de negócio e garantem a confiabilidade dos dados,
antes que o aplicativo servidor atualize o banco de dados ou apresente os dados
para os usuários (negociação feita nessa camadas, pela classe que representa a
lógica do controlador). As regras de negócio dizem como os clientes podem e não
podem acessar os dados do aplicativo e como os aplicativos processam esses
dados.
2 – Camada Intermediaria: Lógica de Negócios
A primeira classe que será
apresentada é a classe clnClientes.cs, nesta classe serão definidos os campos
membros, atributos/propriedades e métodos.
Como boa prática de programação
as variáveis de instância da classe estarão definida como PRIVATE, sendo acessíveis apenas dentro da própria classe pelas
propriedades que utilizaremos através de seus métodos de acesso para exibir ou
ler os dados. (Métodos Get e Set).
Mão na Massa:
1) Com o aplicativo aberto
Seguros_OO, dê um clique com o botão direito do mouse sobre a pasta [Logica Negocios], selecione a opção ADD à
New Item e Adicione uma nova classe, com o nome “clnClientes.cs”.

Figura 2 – Classe Clientes
Nota do Autor: Procurei comentar ao máximo esta classe, para que
facilite o entendimento, no entanto, caso algo não fique claro, podem-me
escrever, sempre coloco o meu e-mail no final dos artigos. Nessa camada você
poderia implementar algumas regras que ao longo dos artigos não vou definir,
pois o objetivo aqui é não complicar o
entendimento. Mas fique a vontade para incluir regras nessa camada, tais
como checagem dos dados, consistência de valores.
Antes de digitar o código, a
classe clnClientes.cs a figura
abaixo mostra como ela está definida:

Figura SEQ Figura \* ARABIC 3 - Detalhes da Classe
clnClientes.cs
Pronto agora é só digitar, ou copiar, se assim o preferir:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace Seguros_OO.Camada_Intermediaria.Logica_Negocios
{
public class clnClientes
{
//1 - Campos privados a classe
private
int idCli;
private
string nomeCli;
private
string enderecoCli;
private
string foneCli;
private
string faxCli;
private string obsCli;
//2 - propriedades, acesso aos campos privados
public int
IdCli
{
get
{ return idCli; }
set
{ idCli = value; }
}
public string NomeCli
{
get
{ return nomeCli; }
set
{ nomeCli = value; }
}
public string EnderecoCli
{
get
{ return enderecoCli; }
set
{ enderecoCli = value; }
}
public string FoneCli
{
get
{ return foneCli; }
set
{ foneCli = value; }
}
public string FaxCli
{
get
{ return faxCli; }
set
{ faxCli = value; }
}
public string ObsCli
{
get
{ return obsCli; }
set
{ obsCli = value; }
}
//3 - métodos da classe de Negócios (clnCliente.cs)
//3.1 Buscar dados do cliente cujo codigo foi especificado
public void Buscar()
{
string
csql;
csql = "Select
* From tbCliente where idCli=" + IdCli;
DataSet ds;
clsDados seguros = new
clsDados();
ds =
seguros.RetornarDataSet(csql);
if (ds.Tables[0].Rows.Count > 0)
{
Array
dados = ds.Tables[0].Rows[0].ItemArray;
idCli = Convert.ToInt16(dados.GetValue(0));
nomeCli = Convert.ToString(dados.GetValue(1));
enderecoCli = Convert.ToString(dados.GetValue(2));
foneCli = Convert.ToString(dados.GetValue(3));
faxCli = Convert.ToString(dados.GetValue(4));
obsCli = Convert.ToString(dados.GetValue(5));
}
}
//3.2 Buscar o próximo Id Numerico para
//inclusao de um novo cliente.
public int BuscarId()
{
string
csql;
csql = "Select
Top 1 (IdCli) From TbCliente order by IdCli desc";
int IdBuscado;
clsDados seguros = new
clsDados();
IdBuscado=seguros.RetornarIdNumerico(csql);
return IdBuscado;
}
//3.3 Método para incluir um novo cliente no
//Banco de dados
public void Gravar()
{
StringBuilder
csql = new StringBuilder();
csql.Append("Insert into tbCliente");
csql.Append("(");
csql.Append("idCli,");
csql.Append("nomeCli,");
csql.Append("enderecoCli,");
csql.Append("foneCli,");
csql.Append("faxCli,");
csql.Append("obsCli) Values(");
csql.Append(idCli);
csql.Append(",'" + nomeCli +"',");
csql.Append("'" + enderecoCli + "',");
csql.Append("'" + foneCli
+ "',");
csql.Append("'" + faxCli + "',");
csql.Append("'" + obsCli + "')");
clsDados seguros = new clsDados();
seguros.ExecutarComando(csql.ToString());
}
//3.4 Método para atualizar (alterar um registro)
public void Atualizar()
{
StringBuilder
csql = new StringBuilder();
csql.Append("Update
tbCliente ");
csql.Append("set idCli=");
csql.Append(IdCli);
csql.Append(", nomeCli='");
csql.Append(nomeCli);
csql.Append("', enderecoCli='");
csql.Append(enderecoCli);
csql.Append("', foneCli='");
csql.Append(foneCli);
csql.Append("', faxCli='");
csql.Append(faxCli);
csql.Append("', obsCli='");
csql.Append(obsCli);
csql.Append("' where idCli=");
csql.Append(IdCli);
clsDados seguros = new
clsDados();
seguros.ExecutarComando(csql.ToString());
}
//3.5 Método para excluir um cliente do
//Banco de dados
public void Excluir()
{
StringBuilder
csql = new StringBuilder();
csql.Append("Delete From tbCliente ");
csql.Append(" where idCli=");
csql.Append(IdCli);
clsDados seguros = new clsDados();
seguros.ExecutarComando(csql.ToString());
}
}
}
Conclusão
Nesse terceiro artigo foi
apresentada a primeira classe que compõe a regras de negócios do Sistema de
Controle de Apólices de Seguro proposto.
Como já apresentado a lógica de
negócios na camada 2 impõe as regras de negócio e garantem a confiabilidade dos
dados, antes que o aplicativo servidor atualize o banco de dados ou apresente
os dados para os usuários (acesso aos dados: tarefa da classe clnDados.cs – lógica
do controlador).
Ao final dessa série de artigos, disponibilizarei
o código dessa aplicação exemplo. No
entando fica como desafio ao
leitor, criar as demais classes básicas que compões a lógica de negócios.
No próximo artigo será
apresentado a camada de apresentação, onde serão criados o formulário para
cadastro de dados do cliente e o formulário de pesquisa genérico que poderá ser
utilizado em toda a aplicação.
Nota Importante: Neste exemplo não separamos as camadas em projetos
diferentes dentro de uma solução. Usamos apenas pastas (folders) para isso.
Nada impede que você adote essa prática, projetos maiores ficam de forma melhor
organizados com esse procedimento. A única coisa é que não pode-se esquecer de
colocar as referências aos projetos em uso. Ex: o projeto que conteriam as regras de negócio
teriam que ter uma referencia adicionada ao projeto do controlador, e assim por
diante.
Qualquer dúvida quanto a esse
artigo entre em contato pelo e-mail: professormoraes_arroba_gmail.com.
Um grande abraço, e até o próximo
artigo.
Marcos Roberto de Moraes

11 COMENTÁRIOS
Laércio Queiroz
Olá Marcos, parabéns pelo artigo.
Tenho algumas considerações sobre o artigo:
1) Dentro de sua Camada Intermediária existe uma classe denominada "Lógica do Controlador". IMHO, acho que este não seja um nome adequado para esta classe. Como o seu objetivo é abstrair algumas operações com o banco de dados um nome que mais relacionado à persistência ficaria melhor. Isso evita que profissionais menos experientes possam confundir o papel desta classe com o componente Controller do MVC.
2) Senti a falta de “comportamento” na classe Cliente.
3) Seria interessante você ressaltar no artigo que a abordagem adotada para persistência - código de acesso a dados dentro do objeto de negócio – deve ser evitada em projetos mais complexos, por diversos motivos. Ao invés disto, usaríamos objetos que façam o mapeamento entre os objetos de domínio com o banco de dados ou uma outra fonte qualquer.
Desta forma, os objetos de negócio ficam livres do mecanismo de persistência e no máximo sabem da existência de um repositório de objetos.
Aguardo os próximos artigos.
Grande Abraço.
Laércio Queiroz
http://laercioqueiroz.wordpress.com
[há +1 ano] -
Responder
Marcos Roberto De Moraes
Perfeita sua observação. O Nome adotado segue uma notação mais utilizada em termos da abstração de Dados. Como no começo me referencie as anotações de Deitel sobre a linguagem talvez (tenho quase certeza) a tradução técnica não esteja a melhor possível (vamos entender aqui controlador) como parte da camada que lida diretamente com os dados e não (jamais) com o Controller do MVC.
Quanto ao objeto Mapeamento, creio eu que aqui no próprio portal, tem ótimos artigos como as vídeo aulas sobre o NHibernate propostas pelo Regilan que mostram o funcionamento dos componentes do MVC. Mas fico muito GRATO pelas suas observações. E com certeza em projetos maiores é melhor essa divisão. Acho que a própria nota no final desse documento leva o leitor a essa consideração. Mais uma vez obrigado pelas considerações.
[há +1 ano] -
Responder
Marcos Roberto De Moraes
As vídeo aulas são do Rodrigo e não do Regilan, sorry. :-)
[há +1 ano] -
Responder

Emilio Ap Mazola
Boa noite, Deus Abençoe esclareceu minhas duvidas
Muito bom mesmo
Fico aguardando por mais uma obra de arte
Obrigado Emilio Saron Eletrônica.
[há +1 ano] -
Responder

Ivair Teodoro
Prof. Moraes esta dando este dois erros no exemplo 3.
Será q poderia me ajudar
Error 1 The type ''seguros_oo.Camada_Intermediaria.Logica_Negocios.clnclientes'' already contains a definition for ''idcli''
clsdados seguros = new clsdados();
Error 1 The type or namespace name ''clsdados'' could not be found (are you missing a using directive or an assembly reference?)
Será q poderia me ajudar
using system;
using system.collections.generic;
using system.text;
using system.data;
using system.data.sqlclient;
namespace seguros_oo.camada_intermediaria.logica_negocios
{
public class clnclientes
{
//1 - campos privados a classe
private
int idcli;
private
string nomecli;
private
string enderecocli;
private
string fonecli;
private
string faxcli;
private string obscli;
//2 - propriedades, acesso aos campos privados
public int
idcli
Error 1 The type ''seguros_oo.Camada_Intermediaria.Logica_Negocios.clnclientes'' already contains a definition for ''idcli''
clsdados seguros = new clsdados();
Error 1 The type or namespace name ''clsdados'' could not be found (are you missing a using directive or an assembly reference?)
[há +1 ano] -
Responder
[autor]
Marcos Roberto De Moraes
Error 1 The type ''seguros_oo.Camada_Intermediaria.Logica_Negocios.clnclientes'' already contains a definition for ''idcli''
==> Veja se não é o case sensitive. Maiúsculo / Minúsculo.
Se persistir os erros baixe o projeto que está disponível na última aula e compare. Qq coisa escreva.
[há +1 ano] -
Responder
Ivair Teodoro
clsdados seguros = new clsdados();
Error 1 The type or namespace name ''clsdados'' could not be found (are you missing a using directive or an assembly reference?)
Ja tentei referenciar varios assembly,mas continua mesmo erro.
Error 1 The type or namespace name ''clsdados'' could not be found (are you missing a using directive or an assembly reference?)
Ja tentei referenciar varios assembly,mas continua mesmo erro.
Tentei baixar o exemplo pronto p/ conferir com o meu,mas não acha o arquivo.
Obrigado pela resposta.
[há +1 ano] -
Responder
Ivair Teodoro
No final do Parte 3,vc pede fazer uma referencia regras de negocio a projeto controlador.Como Faço
Isto.
Obrigado
Ivair
[há +1 ano] -
Responder
Peterson De Aquino
Boa tarde,
Para fazer a referência é necessário colocar este ''using'':
using GNS.Camada_Intermediaria.Logica_Controlador;
Até mais.
[há +1 ano] -
Responder

Mário Mineiro
Olá Prof Marcos.
Desde já os meus parabéns pelo conjuntos de artigos muito bem conseguidos e de muito interesse didáctico.
No entanto fico com duas duvidas:
1ªComo implementar no caso da clnClientes estar relacionada com uma tabela com um atributo/campo SQL do tipo "image" para por exemplo colocar a fotografia do cliente.
2ªComo lidar com atributos que permitem NULOS (Allow Nulls) na base de dados?
Poderias dar uma ajudinha na forma de implementar a solução por exemplo nos métodos Gravar e Atualizar da clnClientes e no evento do private void txtidApolice_Leave do FrmApolices?
Abraços,
[há +1 ano] -
Responder
Luiz Agnelo C. Maia
Mário,
No caso de gravar em campo do tipo Image no SQL, vc deve converter a imagem em bites [binário]:
Para atributos que permitem Nulls, faça o seguinte:
SqlParameter param = new SqlParameter("@Qty", txt1.Text.Trim().Length==0?DBNull.Value:int.Parse(txt1.Text));
[há +1 ano] -
Responder
Desenvolvimento Multicamadas em Csharp (C#(csharp)) - Parte 5 - Exemplo prático [Classes Auxiliares]
[Este post ainda não foi associado a uma sequência]
Você está em:
canal .net
Marcos Roberto De Moraes
Space do autor
Mestre em Educação pela UNISAL.
Especialista em Administração de Sistemas de Informação pela Universidade Federal de Lavras-MG (UFLA).
Licenciado pleno em informática pela Universidade Metodista de Piracicaba (UNIMEP).
Graduado em Tecnologia em Processamento de Dados pela Unipinhal.
...
Especialista em Administração de Sistemas de Informação pela Universidade Federal de Lavras-MG (UFLA).
Licenciado pleno em informática pela Universidade Metodista de Piracicaba (UNIMEP).
Graduado em Tecnologia em Processamento de Dados pela Unipinhal.
...
Space do autor



11
0
